home *** CD-ROM | disk | FTP | other *** search
- /*
- Oh!X5号
- GalaxyKnigtsサンプル1
- マップコントロール部分
- */
-
- #include "stdafx.h"
- #include "ohx5_1.h"
-
- // 形状データ(今回のみ内蔵)
- long sdata[]={
- SIMPLE_CUBE, 2000, 4000, 2000,
- FILE_DATA, 1, 150000,
- FILE_DATA, 2, 150000,
- FILE_DATA, 3, 150000,
- FILE_DATA, 4, 150000,
- FILE_DATA, 5, 150000,
- FILE_DATA, 6, 150000,
- FILE_DATA, 7, 150000,
- FILE_DATA, 8, 150000,
- FILE_DATA, 9, 150000,
- SIMPLE_TORUS, 100, 150,
- SHAPE_DONE
- };
- // マップ(これも今回のみ内蔵)
- long mapdata[]={
- 2, -60000,-2000, 60000, 0,0,0,
- 3, -60000,-2000, 120000, 0,0,0,
- 4,-120000,-2000, 180000, 0,0,0,
- 5,-120000,-2000, 120000, 0,0,0,
- 6,-120000,-2000, 60000, 0,0,0,
- 7, 240000,-2000,-180000, 0,0,0,
- 8,-180000,-2000,-180000, 0,0,0,
- 9,-180000,-2000,-180000, 0,0,0,
- 10,180000,-2000,-120000, 0,0,0,
- 10,180000,-2000, -60000, 0,0,0,
- 0
- };
-
- // 衝突/イベント判定エリア
- // 0=データ終端
- // 1=衝突判定
- // 2=イベント(イベント言語の起動)
- // 3=ビルトインリンク(配布済みデータの参照)
- // 4=ローカルリンク(同一マップの別空間と接続)
- // 5=メタリンク(同一サーバー別マップと接続)
- // 6=ハイパーリンク(別サーバー別マップと接続) 未対応
- long areas[]={
- 1,
- 3,
- 0
- };
-
- char *file_datanames[]={
- "data\\B01_F.x",
- "data\\B02_F.x",
- "data\\B03_F.x",
- "data\\b04_F.x",
- "data\\b05_F.x",
- "data\\b06_F.x",
- "data\\b07_F.x",
- "data\\b07_F.x",
- "data\\b07_F.x"
- };
-
- void splitpath( char* fpath,char* fname )
- {
- char *fp,*fn,*fpx;
- fp = fpath;
- fn = fname;
- fpx = NULL;
- while( *fn!=0 ){
- if( *fn=='\\' ) fpx = fp;
- *fp++ = *fn++;
- }
- *fp = 0;
- if( fpx!=NULL ){
- fpx++;
- *fpx = 0;
- }
- }
- /*
- 形状の初期化
- 今回は内蔵データを利用
- */
-
- void init_shapes()
- {
- HRESULT hr;
- int sct,name,i;
- float v1,v2,v3;
- shapes* spt = shapelist;
- char xfilepath[1024];
- char *xfilename;
- sct = 0;
- max_shapes = 0;
- while( sdata[sct]!=SHAPE_DONE ){
- name = sdata[sct++];
- spt->type = name;
- spt->scale= 1;
- switch( name ){
- case SIMPLE_CUBE: // 立方体
- v1 = (float)sdata[sct++]/1000; // witdh
- v2 = (float)sdata[sct++]/1000; // height
- v3 = (float)sdata[sct++]/1000; // depth
- hr = D3DXCreateBox( lpD3DD,v1,v2,v3,&(spt->pt),NULL );
- break;
- case SIMPLE_SPHERE: // 球
- v1 = (float)sdata[sct++]/1000; // radius
- hr = D3DXCreateSphere( lpD3DD,v1,D3DX_DEFAULT,D3DX_DEFAULT, &(spt->pt),NULL );
- break;
- case SIMPLE_CYLINDER: // シリンダー
- v1 = (float)sdata[sct++]/1000; // base radius
- v2 = (float)sdata[sct++]/1000; // top radius
- v3 = (float)sdata[sct++]/1000; // height
- hr = D3DXCreateCylinder( lpD3DD,v1,v2,v3,D3DX_DEFAULT,D3DX_DEFAULT,&(spt->pt),NULL );
- break;
- case SIMPLE_TORUS: // トーラス
- v1 = (float)sdata[sct++]/1000; // inner radius
- v2 = (float)sdata[sct++]/1000; // outer radius
- hr = D3DXCreateTorus( lpD3DD,v1,v2,D3DX_DEFAULT,D3DX_DEFAULT,&(spt->pt),NULL );
- break;
- case FILE_DATA: // X-flie形式のロード
- LPD3DXBUFFER xbuf; // XFILEマテリアルバッファ
- xfilename = file_datanames[ sdata[sct++] ];
- if( xfilename==NULL ) { sct++; break; }
- if( FAILED( D3DXLoadMeshFromX( xfilename,
- D3DXMESH_SYSTEMMEM,
- lpD3DD,
- NULL,
- &xbuf,
- &( spt->mats ),
- &( spt->pt ) ) ) ){
- sct++;
- break;
- }
- D3DXMATERIAL* lpxmats = (D3DXMATERIAL*)xbuf->GetBufferPointer();
-
- spt->lpmmats = new D3DMATERIAL8[spt->mats];
- spt->lpmtexs = new LPDIRECT3DTEXTURE8[spt->mats];
-
- for( i=0; i<(int)(spt->mats); i++ ){
- spt->lpmmats[i] = lpxmats[i].MatD3D;
- spt->lpmmats[i].Ambient = spt->lpmmats[i].Diffuse;
- // テクスチャを作成する。
- splitpath( xfilepath,xfilename );
- if( lpxmats[i].pTextureFilename != NULL ){
- strcat( xfilepath,lpxmats[i].pTextureFilename );
- if( FAILED( D3DXCreateTextureFromFile( lpD3DD,
- xfilepath,
- &( spt->lpmtexs[i] ) ) ) )
- spt->lpmtexs[i] = NULL;
- }
- }
- spt->scale = (float)( sdata[ sct++ ] )/1000;
- xbuf->Release();
- break;
- }
- spt++;
- max_shapes++;
- }
- }
-
- // 形状データ解放
- void release_shapes()
- {
- DWORD i,j;
- shapes * spt = shapelist;
- for( i=0;i<max_shapes;i++ ){
- if( spt->type==FILE_DATA ){
- if( spt->lpmmats != NULL ) delete[] spt->lpmmats;
- if( spt->lpmtexs ) {
- for( j = 0; j < spt->mats; j++ ) {
- if( spt->lpmtexs[j] ){ spt->lpmtexs[j]->Release(); }
- }
- delete[] spt->lpmtexs;
- }
- }
- xRelease( spt->pt );
- spt++;
- }
- }
-
- // 物体バッファを1つ確保
- OBJ3D *make_object( DWORD name )
- {
- OBJ3D *obj;
- obj = new OBJ3D;
- obj->back = NULL;
- obj->next = objtop;
- if( objtop!=NULL ) objtop->back = obj;
- objtop = obj;
- obj->type = name;
- return obj;
- }
-
- // 物体バッファを1つ消去
- void delete_object( OBJ3D *obj )
- {
- if( obj==NULL ) return;
- if( objtop == obj ) objtop = objtop->next;
- if( obj->back != NULL ) obj->back->next = obj->next;
- if( obj->next != NULL ) obj->next->back = obj->back;
- xDelete( obj );
- }
-
- // マップから物体リストを初期化
- void init_objects()
- {
- long name;
- int ct=0;
- OBJ3D *obj;
- for(;;){
- name = mapdata[ ct++ ];
- if( name==0 ) break;
- obj = make_object( name-1 );
- obj->pos.x = (float)mapdata[ct++]/1000;
- obj->pos.y = (float)mapdata[ct++]/1000;
- obj->pos.z = (float)mapdata[ct++]/1000;
- obj->rudder.x = D3DXToRadian( mapdata[ct++] );
- obj->rudder.y = D3DXToRadian( mapdata[ct++] );
- obj->rudder.z = D3DXToRadian( mapdata[ct++] );
- }
- }
-
- void release_objects()
- {
- OBJ3D *obj = objtop;
- OBJ3D *nx;
- while( obj !=NULL ){
- nx = obj->next;
- delete_object( obj );
- obj = nx;
- }
- }
-
- // プレイヤーステータス初期化
- void init_player()
- {
- make_myself();
- D3DXVECTOR3 zero;
- zero.x = zero.y = zero.z = 0;
- myself->objp->pos = myself->objp->rudder =
- myself->objp->move = myself->objp->rotate = zero;
- myself->objp->rudder.y = D3DXToRadian( 45 );
- }
- // プレイヤーによる制御
- void player_drive()
- {
- WORD key = GetKeys();
- command_player( myself->objp,( key << 16 )| dpmsg_data_packet );
- send_player_control( myself->dplayID, key );
-
- camera_pos = myself->objp->pos;
- camera_rud = myself->objp->rudder;
- }
-
-
- // プレイヤーの挙動
- // 複数プレイヤー対応版
- void command_player( OBJ3D *ob,DWORD cmd )
- {
- WORD key = (WORD)( cmd>>16 );
-
- if( key & PAD_CMD ){
- // 左右に平行移動
- // 上下に平行移動
-
- } else {
- // 左右に旋回
- if( key & PAD_LEFT ){
- if( ob->rotate.y<0.05f ) ob->rotate.y += 0.002f;
- } else if( key & PAD_RIGHT ){
- if( ob->rotate.y>-0.05f ) ob->rotate.y -= 0.002f;
- } else {
- if( ob->rotate.y>0.002f ) ob->rotate.y *= 0.8f; else ob->rotate.y = 0;
- }
- // 上下に旋回(最大上下30度。旋回していないときは、自動的に水平に戻る)
- if( key & PAD_UP ){
- if( ob->rotate.x<0.05f ) ob->rotate.x += 0.002f;
- } else if( key & PAD_DOWN ){
- if( ob->rotate.x>-0.05f ) ob->rotate.x -= 0.002f;
- } else {
- ob->rotate.x = 0;
- }
- }
- // 前進
- if( key & PAD_FORWARD ){
- if( ob->move.z<1 ){
- ob->move.z += 0.002f;
- } else {
- ob->move.z = 1;
- }
- } else {
- if( ob->move.z>0.002f ) ob->move.z *= 0.8f; else ob->move.z = 0;
- }
- // ベクトル加算
- ob->rudder.y += ob->rotate.y;
- if( ob->rotate.x!=0 ){
- ob->rudder.x += ob->rotate.x;
- if( ob->rotate.x<0 ){
- if( ob->rudder.x<-0.7f ) ob->rudder.x = -0.7f;
- } else {
- if( ob->rudder.x> 0.7f ) ob->rudder.x = 0.7f;
- }
- } else {
- ob->rudder.x *= 0.8f;
- if( ob->rudder.x<0.01f && ob->rudder.x>-0.01f ){ ob->rudder.x = 0; }
- }
- // 移動ベクトル生成
- D3DXMATRIX mat;
- D3DXMatrixRotationY( &mat,-ob->rudder.y );
- D3DXVECTOR3 mv;
- mv = ob->move;
- D3DXVec3TransformNormal( &mv,&mv,&mat );
- ob->pos += mv;
- }
-